package com.docmgmt.mvp.ragflow.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import java.util.List;

/**
 * RAGFlow 解析器配置 DTO
 * 
 * 对应 RAGFlow API 的 parser_config 参数
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ParserConfigDTO {

    /**
     * 自动提取关键词数量（0-32）
     */
    @JsonProperty("auto_keywords")
    @Min(0)
    @Max(32)
    private Integer autoKeywords;

    /**
     * 自动生成问题数量（0-10）
     */
    @JsonProperty("auto_questions")
    @Min(0)
    @Max(10)
    private Integer autoQuestions;

    /**
     * 分块token数量（1-2048）
     */
    @JsonProperty("chunk_token_num")
    @NotNull(message = "chunk_token_num不能为空")
    @Min(1)
    @Max(2048)
    private Integer chunkTokenNum;

    /**
     * 分隔符（默认 \n）
     */
    @NotNull(message = "delimiter不能为空")
    private String delimiter;

    /**
     * GraphRAG 配置
     */
    private GraphragConfigDTO graphrag;

    /**
     * Excel转HTML（仅table类型）
     */
    @JsonProperty("html4excel")
    private Boolean html4excel;

    /**
     * 布局识别方法（DeepDOC/OCR）
     */
    @JsonProperty("layout_recognize")
    private String layoutRecognize;

    /**
     * RAPTOR 配置
     */
    private RaptorConfigDTO raptor;

    /**
     * 标签知识库ID列表（仅tag类型）
     */
    @JsonProperty("tag_kb_ids")
    private List<String> tagKbIds;

    /**
     * Top N 标签数量（1-10，仅tag类型）
     */
    @JsonProperty("topn_tags")
    @Min(1)
    @Max(10)
    private Integer topnTags;

    /**
     * 文件名嵌入权重（0.0-1.0）
     */
    @JsonProperty("filename_embd_weight")
    @Min(0)
    @Max(1)
    private Double filenameEmbdWeight;

    /**
     * 任务页面大小（可选）
     */
    @JsonProperty("task_page_size")
    @Min(1)
    private Integer taskPageSize;

    /**
     * 页面范围（可选，格式：[[1,3], [5,10]]）
     */
    private List<List<Integer>> pages;

    /**
     * GraphRAG 配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class GraphragConfigDTO {
        
        /**
         * 是否启用 GraphRAG
         */
        @JsonProperty("use_graphrag")
        private Boolean useGraphrag;

        /**
         * 实体类型列表
         */
        @JsonProperty("entity_types")
        private List<String> entityTypes;

        /**
         * 方法：light/general
         */
        private String method;

        /**
         * 是否启用社区检测
         */
        private Boolean community;

        /**
         * 是否启用分辨率
         */
        private Boolean resolution;
    }

    /**
     * RAPTOR 配置
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class RaptorConfigDTO {
        
        /**
         * 是否启用 RAPTOR
         */
        @JsonProperty("use_raptor")
        private Boolean useRaptor;

        /**
         * 摘要提示词
         */
        private String prompt;

        /**
         * 最大token数（1-2048）
         */
        @JsonProperty("max_token")
        @Min(1)
        @Max(2048)
        private Integer maxToken;

        /**
         * 相似度阈值（0.0-1.0）
         */
        @Min(0)
        @Max(1)
        private Double threshold;

        /**
         * 最大聚类数（1-1024）
         */
        @JsonProperty("max_cluster")
        @Min(1)
        @Max(1024)
        private Integer maxCluster;

        /**
         * 随机种子
         */
        @JsonProperty("random_seed")
        @Min(0)
        private Integer randomSeed;
    }
}

